package com.lntu.meeting.service.impl;

import com.lntu.meeting.ReserveForm.ReserveForm;
import com.lntu.meeting.mapper.ReserveMapper;
import com.lntu.meeting.pojo.Notes;
import com.lntu.meeting.service.ReserveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.net.Inet4Address;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import static com.lntu.meeting.common.checkDate.checkDate;
import static com.lntu.meeting.common.checkDate.formatDate;
import static com.sun.javafx.geom.Arc2D.PIE;

/**
 * service层判断是否可以预约类
 * 作者 ： 杨颜泽
 * 版本 ： v1.0
 */
@Service
public class ReserveServiceImp implements ReserveService {

    //可否插入状态码
    boolean code = false;

    //数据库中Id
    Integer Id;

    //注入Mapper
    @Autowired
    private ReserveMapper reserveMapper;

    Notes notes =new Notes();



    /**
     *  通过毫秒数来判断是否可以预约，如果可以插入到数据库中
     * @param : reserveForm 前端传回表单内容
     * @return : code
     */
    @Override
    public Boolean selectDate(ReserveForm reserveForm) {
        //获取前端传回的房间号
        Integer roomNo = reserveForm.getRoomNo();
        //调用方法查询所这个会议预约的所有信息
        List<Notes> notesList = selectDate(roomNo);
        System.out.println("该会议室所有预定信息"+notesList);

        //如果数据库中这个房价并没有被预定过直接插入
        if (notesList.size()>0){

            //从前端获取到时间，同时进行字符串拼接方便后面判断
            String StartDate = reserveForm.getDate();
            String EndDate = reserveForm.getEndDate();

            //判断是否为周期预约
            //lx是true是周期预约


            //字符串拼接方便后面调用方法判断
            String StartTime = "-"+String.valueOf(reserveForm.getStartTime());
            StartDate = StartDate+StartTime;

            //从前端获取到时间，同时进行字符串拼接方便后面判断
            String EndTime = "-"+String.valueOf(reserveForm.getEndTime());
            EndDate = EndDate+EndTime;

            //通过调用自定义方法formatDate，从而类型转换为Date类型，方便判断。
            Date reserveStartDate = formatDate(StartDate);
            Date endStartDate = formatDate(EndDate);

//        通过调用自定义方法checkDate循环从判断输入的时间是否在数据库中存在
            for (Notes notes : notesList) {
                // 从数据库中获取开始和结束的时间
                Date dataStartDate = notes.getStartDate();
                Date dataEndDate =  notes.getEndDate();
                System.out.println("dataEndDate"+dataEndDate);

                //获取到具体时间赋值到date中，方面后面利用毫秒来进行判断。
               /* dataStartDate.setTime(dataStartDate.getTime() + 3600000*Math.round(notes.getStartTime()));
                dataEndDate.setTime(dataEndDate.getTime() + 3600000*Math.round(notes.getEndTime()));
*/
                //调用方法通过毫秒值判断是否可以插入。
                code = checkDate(dataStartDate,dataEndDate,reserveStartDate,endStartDate);

                //如果可以插入直接结束循环。
                if (!code){
                    System.out.println("code1"+code);
                    break;
                }

                Id = notes.getId();
            }

            //把Interger转为Float类型，方便插入数据库
            Integer temp = new Integer(reserveForm.getStartTime());
            Float startTime = new Float(temp.floatValue());

            //把Interger转为Float类型
            Integer temp2 = new Integer(reserveForm.getEndTime());
            Float endTime = new Float(temp2.floatValue());

            //如果可以插入给对象赋值传入到数据库中
            if (code){
                System.out.println("code2"+code);

                //给对象赋值
                notes.setId(Id+=1);
                notes.setUserId(reserveForm.getUserId());
                notes.setRoomNo(reserveForm.getRoomNo());
                notes.setStartTime(startTime);
                notes.setEndTime(endTime);
                notes.setStartDate(reserveStartDate);
                notes.setEndDate(endStartDate);

                System.out.println("要插入数据库的值"+notes);

                //调用插入sql语句 插入数据
                reserveMapper.insertMeet(notes);

            }
        }else {

            //如果不是周期预约字符串拼接，直接插入到数据库中
            //拼接日期时间
            String time1=String.valueOf(reserveForm.getStartTime());
            String time2=String.valueOf(reserveForm.getEndTime());
            Date reserveStartDate = formatDate(reserveForm.getDate()+"-"+time1);
            Date endStartDate = formatDate(reserveForm.getEndDate()+"-"+time2);

            Integer Id=reserveMapper.getMaxId();
            if (Id==null){Id=0;}
            System.out.println("最大id"+Id);
            System.out.println();

            //对象赋值。
            notes.setId(Id+=1);
            notes.setUserId(reserveForm.getUserId());
            notes.setRoomNo(reserveForm.getRoomNo());
            notes.setStartTime((float)reserveForm.getStartTime());
            notes.setEndTime((float)reserveForm.getEndTime());
            notes.setStartDate(reserveStartDate);
            notes.setEndDate(endStartDate);

            //调用插入sql语句 插入数据
            reserveMapper.insertMeet(notes);
            code = true;
        }

        return code;
    }

    //查询出数据库中存在的所有值
    @Override
    public List<Notes> selectDate(Integer roomNo) {
        return reserveMapper.selectDate(roomNo);
    }

}
